package barrier;

import java.awt.Graphics;
import java.awt.image.BufferedImage;

import ball.Ball;
import util.Contents;
import util.Functions;
/*
 * 障碍物类，负责记录障碍物位置并根据位置信息画出障碍物以及障碍物的放大缩小
 * 同时负责控制障碍物的旋转，与球的碰撞检测
 */
public abstract class Barrier {
	// 当前所在的角度，也就是不同图形旋转的阶段
	protected int angle;
	// 图形周期，比如三角形为4，圆形为1
	protected int imgT;
	// 在格子中占据的大小
	protected int size;
	// 障碍物种类
	protected String type;
	// 障碍物的左上角坐标
	protected double x;
	protected double y;
	// 障碍物相对于格子的长宽比
	protected double bx;
	protected double by;
	// 障碍物的右下角坐标
	protected double ex;
	protected double ey;
	// 障碍物图片
	protected BufferedImage img;

	// 构造函数
	public Barrier(int imgT, String type, double x, double y, double bx, double by, int size) {

		this.imgT = imgT;
		this.type = type;
		this.angle = 0;
		this.x = x;
		this.y = y;
		this.bx = bx;
		this.by = by;
		this.size = size;
		changeEx();
		changeEy();
	}

	// 检测是否碰撞了球函数，若碰撞，则需要改变球的速度
	public abstract void isCollided(Ball b);

	// 打印函数，直接打印图片到指定位置
	public void paint(Graphics g) {
		g.drawImage(img, (int) x, (int) y, (int) ex - (int) x, (int) ey - (int) y, null);
	}

	// 旋转函数，根据周期旋转当前的角度，并且将图片旋转
	// 此处图片旋转尚未实现，若发现，请告知，如果发现已经写好但没有删除注释，请删除
	public boolean rotate() {
		angle = (angle + 1) % imgT;
		img = Functions.rotateClockwise90(img);
		return true;
	}

	public double setX(double x) {
		this.x = x;
		changeEx();
		return x;
	}

	public double setY(double y) {
		this.y = y;
		changeEy();
		return y;
	}
	// 获取当前的左上角横轴坐标
	public double getX() {
		return x;
	}

	// 获取当前的左上角纵轴坐标
	public double getY() {
		return y;
	}

	// 获取当前的右下角横轴坐标
	public double getEx() {
		return ex;
	}

	// 获取当前的左上角纵轴坐标
	public double getEy() {
		return ey;
	}

	// 获取障碍物类型
	public String getType() {
		return type;
	}

	// 获得障碍物的大小
	public int getSize() {
		return size;
	}
	
	public int getAngle() {
		return angle;
	}

	// 根据左上角坐标和大小以及长宽比去计算右下角坐标
	public void changeEx() {
		ex = x + size * Contents.LATTICE_SIZE * bx;
	}

	public void changeEy() {
		ey = y + size * Contents.LATTICE_SIZE * by;
	}

	// 放大一个障碍物
	public boolean toBigger() {
		// 不越界，就可以放大
		if (ex + Contents.LATTICE_SIZE * bx <= Contents.ALL_LATTICE_WIDTH
				&& ey + Contents.LATTICE_SIZE * by <= Contents.ALL_LATTICE_HEIGHT) {
			size++;
			changeEx();
			changeEy();
			return true;
		}
		return false;
	}

	// 缩小一个障碍物
	public boolean toSmaller() {
		// 大小大于1，就可以缩小
		if (size > 1) {
			size--;
			changeEx();
			changeEy();
			return true;
		}
		return false;
	}

}
